package com.shundr.frame.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.content.Context;
import android.content.res.Resources;
import android.os.Handler;
import android.util.DisplayMetrics;
import cn.jpush.android.api.JPushInterface;

import com.baidu.mapapi.SDKInitializer;
import com.shundr.R;
import com.shundr.common.http.CommonRequest;
import com.shundr.common.util.PrefConstants;
import com.shundr.common.util.PrefUtils;
import com.shundr.frame.constant.LConstants;
import com.shundr.frame.constant.LContext;
import com.shundr.frame.db.DBHelper;
import com.shundr.frame.db.LDaoManager;
import com.shundr.frame.http.HttpExecutor;
import com.shundr.frame.service.PusherManager;
import com.shundr.user.dao.UserDao;
import com.shundr.user.model.UserInfo;


/**
 * 
 * LLoader 应用开启时初始化应用的loader
 * 
 * @author larry 2015-4-10 下午2:33:48 
 * @version 1.0.0
 *
 */
public class LLoader {

	public static boolean isInit = false;

	public static void initApp(final Context context) {
		if (isInit) {
			return;
		}
		isInit = true;
		checkDB(context);
		creatBaseDirectory();//创建根目录
		SDKInitializer.initialize(context);//百度地图
		LContext.init(context);
		JPushInterface.init(context);//极光推送
		LDaoManager.init(context);//数据库
		HttpExecutor.init(context);
		LLogger.e("数据初始化完成");
	}
	
	/**
     * 获取屏幕尺寸与密度.
     *
     * @param context the context
     * @return mDisplayMetrics
     */
    public static DisplayMetrics getDisplayMetrics(Context context) {
        Resources mResources;
        if (context == null) {
            mResources = Resources.getSystem();

        } else {
            mResources = context.getResources();
        }
        DisplayMetrics mDisplayMetrics = mResources.getDisplayMetrics();
        return mDisplayMetrics;
    }
	
	/**
     * 检查数据库是否存在，如果不存在，则从raw文件夹拷贝出来
     */
	public static void checkDB(Context context) {
        File db = context.getDatabasePath(DBHelper.DATABASE_NAME);
        if(db.exists()) { 
        	return;
        } else {
        	db.getParentFile().mkdirs();
        	changeDB(context);
        }
    }
	
	/**
	 * 替换db
	 * changeDB(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * @param context
	 * @param db
	 * void
	 * @exception
	 * @since  1.0.0
	 */
	public static void changeDB(Context context){
		File db = context.getDatabasePath(DBHelper.DATABASE_NAME);
		if(db.exists()) { 
			db.delete();
			db.getParentFile().mkdirs();
        } 
		InputStream is = null;
    	FileOutputStream fos = null;
    	try {
    		is = context.getResources().openRawResource(R.raw.shundr_db);
			fos = new FileOutputStream(db);
			byte[] buffer = new byte[1024 * 4];
			while(is.read(buffer) != -1) {
				fos.write(buffer);
			}
			fos.flush();
		} catch (Exception e) {
		} finally {
			if(is != null) {
				try {
					is.close();
				} catch (IOException e) { }
			}
			if(fos != null) {
				try {
					fos.close();
				} catch (IOException e) { }
			}
		}
	}
	
	/**
	 * 初始化用户
	 * initUser(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * @param context
	 * void
	 * @exception
	 * @since  1.0.0
	 */
	public static void initUser(Context context){
		int userId = PrefUtils.getPrefInt(context, PrefConstants.USER_ID, -1);
		String accessToken = PrefUtils.getPrefString(context, PrefConstants.ACCESS_TOKEN, "");
		if(userId > 0){
			LContext.userInfo = new UserDao().getUserById(userId);
			UserInfo user = new UserDao().getUserById(userId);
			if(user != null){
				LContext.userInfo = user;
				LContext.USER_ID = user.getUserId();
				LContext.ACCESS_TOKEN = accessToken;
				
				new PusherManager(context).setAlias(null, user.getUserId() + "");
			}
		}
		if(LContext.isLogin()){
			new CommonRequest(context, new Handler()).checkLoginStatus();
		}
	}
	
	/**
	 * 创建根目录
	 * creatBaseDirectory(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * void
	 * @exception
	 * @since  1.0.0
	 */
	public static void creatBaseDirectory(){
		if(!new File(LConstants.LOG_PATH).exists()){
			new File(LConstants.LOG_PATH).mkdirs();
		}
		if(!new File(LConstants.CRASH_PATH).exists()){
			new File(LConstants.CRASH_PATH).mkdirs();
		}
		if(!new File(LConstants.SOUND_PATH).exists()){
			new File(LConstants.SOUND_PATH).mkdirs();
		}
		if(!new File(LConstants.TEMP_PATH).exists()){
			new File(LConstants.TEMP_PATH).mkdirs();
		}
		if(!new File(LConstants.DOWNLOAD_APP_PATH).exists()){
			new File(LConstants.DOWNLOAD_APP_PATH).mkdirs();
		}
	}
}
